from Crypto.Cipher  import AES
from base64 import b64encode
import requests
import json

#网易云评论爬取
# Crypto.Cipher
#Crypto 私密
#Cipher 暗号
#逻辑
#1.找到未加密的数据   params =>encText   encSecKey=>encSecKey
#2.模拟加密过程
#3.发送请求

#csrf_token= 登录状态  这里并不选择登录
url="https://music.163.com/weapi/comment/resource/comments/get?csrf_token="

#请求方式为post
#rid 音乐id
#pageNo 页数

data={
    "csrf_token": "",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "pageNo": "1",
    "pageSize": "20",
    "rid": "R_SO_4_1325905146",
    "threadId": "R_SO_4_1325905146"
}



e = "010001"
f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e70"
g = "0CoJUm6Qyw8W8jud"
i = "QxAecMjpIKDHUkCu"

#如果当 i 固定写死QxAecMjpIKDHUkCu 则返回下列字符串
def get_enSeckey():
    return "9578c80522185d5ecba35c4e86c0b2f6858f11e8a61e3dc38bca5389466767e97f286eb64dad96f10825ed931bdb6e052957eb377e515945213ffbb8a8078da83a4bad2d5335d5d40e700ae9cde0910e64b8dcb215cf92862423eecf278d4eee35fcd15217c91663e9e9083a20dab448351ea4ab7f13f1ca604d5672b03b1758"

def get_params(data):  #默认收到的是字符串
    first = enc_params(data,g)
    second = enc_params(first,i)
    return second

#拉长数据
def to_16(data):
    pad = 16 -len(data) % 16
    data += chr(pad) * pad
    return  data

def enc_params(data, key):  #加密过程
    iv="0102030405060708"
    data = to_16(data)
    aes = AES.new(key=key.encode("utf-8"), IV=iv.encode("utf-8"), mode=AES.MODE_CBC) #创建加密器
    bs = aes.encrypt(data.encode("utf-8"))   #加密,内容长度必须是16位
    return str(b64encode(bs),"utf-8")


#处理加密过程
"""
    function a(a) { #返回随机的16位字符串
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1)
            e = Math.random() * b.length,  #随机数  eg:1.26
            e = Math.floor(e),             #取整  eg:1
            c += b.charAt(e);              #取字符串第xxx位置的字符 b
        return c
    }
    function b(a, b) {  #a是要加密的内容
        var c = CryptoJS.enc.Utf8.parse(b) #utf-8的一个转换  ^b是秘钥
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a)  #e是数据
          , f = CryptoJS.AES.encrypt(e, c, {  #AES加密算法   ^#c 加密的秘钥
            iv: d,      #偏移量
            mode: CryptoJS.mode.CBC  #使用cbc进行加密
        });
        return f.toString()
    }
    function c(a, b, c) {  #不产生随机数
        var d, e;
        return setMaxDigits(131),
        d = new RSAKeyPair(b,"",c),     #RSA的一个加密
        e = encryptedString(d, a)
    }
    function d(d, e, f, g) { d:数据  e:010001 f:太长 g:固定值
        var h = {} #空函数
          , i = a(16);  #i 16位的随机值      把i设置为定值则h.encSecKey返回的是固定值
        h.encText = b(d, g), #g是 秘钥
        h.encText = b(h.encText, i),  #返回的param   i是秘钥
        h.encSecKey = c(i, e, f),     #返回的encSecKey,e和f是固定的
        return h                      #如果把i固定则得到的enSecKey也是固定
    }
    
    二次加密：
    1.数据 + g => b
    2.第一次加密 + i = b => param
 """

resp=requests.post(url,data={
    "params" : get_params(json.dumps(data)),
    "encSecKey" : get_enSeckey()
})

print(resp.text)
